﻿using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;

namespace SourceGit.ViewModels {
    public class GitFlowStart : Popup {
        [Required(ErrorMessage = "Name is required!!!")]
        [RegularExpression(@"^[\w\-/\.]+$", ErrorMessage = "Bad branch name format!")]
        [CustomValidation(typeof(GitFlowStart), nameof(ValidateBranchName))]
        public string Name {
            get => _name;
            set => SetProperty(ref _name, value, true);
        }

        public string Prefix {
            get => _prefix;
        }

        public bool IsFeature => _type == Models.GitFlowBranchType.Feature;
        public bool IsRelease => _type == Models.GitFlowBranchType.Release;
        public bool IsHotfix => _type == Models.GitFlowBranchType.Hotfix;

        public GitFlowStart(Repository repo, Models.GitFlowBranchType type) {
            _repo = repo;
            _type = type;

            switch (type) {
            case Models.GitFlowBranchType.Feature:
                _prefix = repo.GitFlow.Feature;
                break;
            case Models.GitFlowBranchType.Release:
                _prefix = repo.GitFlow.Release;
                break;
            default:
                _prefix = repo.GitFlow.Hotfix;
                break;
            }

            View = new Views.GitFlowStart() { DataContext = this };
        }

        public static ValidationResult ValidateBranchName(string name, ValidationContext ctx) {
            if (ctx.ObjectInstance is GitFlowStart starter) {
                var check = $"{starter._prefix}{name}";
                foreach (var b in starter._repo.Branches) {
                    var test = b.IsLocal ? b.Name : $"{b.Remote}/{b.Name}";
                    if (test == check) return new ValidationResult("A branch with same name already exists!");
                }
            }

            return ValidationResult.Success;
        }

        public override Task<bool> Sure() {
            _repo.SetWatcherEnabled(false);
            return Task.Run(() => {
                var succ = new Commands.GitFlow(_repo.FullPath).Start(_type, _name);
                CallUIThread(() => _repo.SetWatcherEnabled(true));
                return succ;
            });
        }

        private Repository _repo = null;
        private Models.GitFlowBranchType _type = Models.GitFlowBranchType.Feature;
        private string _prefix = string.Empty;
        private string _name = null;
    }
}
